<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Title</title>
</head>
<body>

</body>
<script>
	// 1- call是一个函数
	// 2- 可以指定函数的this指向，并且可以调用函数并向其传递参数。
	// 3- call接收的第一个参数即是this指向，其余的是传递参数
	// 4- 第一个参数如果是引用类型数据，那么this即是该引用类型数据
	// 5- 如果是字符串，数值，布尔，那么为其对应的包装对象，如果是null,undefined,那么指定的是window
	Function.prototype.myCall = function (context, ...arg) {
		// this指向的是fn.
		// console.log("myCall",this===fn);
		// console.log(arg);
		// console.log(Array.from(arguments).slice(1))
		// this(...arg);
		if (typeof context === "number" || typeof context === "string" || typeof context === "boolean") {
			context = new Object(context);
		}else if(context === undefined || context === null){
			context = window;
		}
		// context中创建一个属性，属性的值即是this
		const propName = Math.random().toString(36).slice(2);
		context[propName] = this;
		context[propName](...arg);
		delete context[propName];
	}
	
	
	function fn(a, b, c) {
		console.log(a, b, c, this);// 1 2 3 100
	}
	
	// fn.myCall({a:1},1,2,3);
	// fn.myCall("100", 1, 2, 3);
	// fn.myCall(undefined, 1, 2, 3);
	fn.myCall(null, 1, 2, 3);
	
</script>
</html>